/**
 * 编写带头结点的单链表中删除一个最小结点的高效算法
 * 
 * 思路：p为遍历指针，pre_p为遍历指针的前驱指针,
 * min指向最小结点，pre_min指向最小结点的前驱结点
 * 
 * 一边扫描，一边比较，如果找到比min结点更小的结点，则修改min和pre_min指针的指向
 * 
 * 当遍历完之后，修改最小结点的前驱结点的next指向:pre_min->next = min->next;避免因发空指针异常
 * 删除min结点
 * 
 * */

void Delete_Min_Node(LinkedList& L)
{
	LNode* p = L->next, *pre_p = L;
	LNode* min = p, *pre_min = pre_p;

	//寻找整个链表中最小的结点及其前驱结点
	while(p) {
		if(p->data < min->data) {
			pre_min = pre_p;
			min = p;
		}
		pre = p;
		p = p->next;
	}
	//找到之后删除最小结点
	pre_min->next = min->next;
	free(min);
}